Nachdem wir uns nun angeschaut haben, wie wir die Netzwerkkommunikation mit einem Server
initiieren können, wollen wir uns noch anschauen, wie wir nun tatsächlich Daten übertragen
können bzw. Daten empfangen können.
Je nachdem, wie viel Kontrolle wir über die Netzwerkkommunikation haben wollen, stehen
uns verschiedene Funktionen zur Verfügung.
Wir haben zum einen die Direktesystemaufruf Schnittstelle, die uns das Betriebssystem
bietet.
Über die können wir mit den Datei-Deskriptoren arbeiten, wobei der Datei-Deskriptor hier
der Socket-Deskriptor ist, da sich Sockets genauso verwenden lassen wie Datei-Deskriptoren.
Oder aber wir greifen auf Bibliotheksfunktionen zurück, die zwar eine weitere Interaktionsstufe
einführen, uns aber dafür Komfortfunktionen bieten, die die Kommunikation vereinfachen.
Wenn wir nun auf Ebene 2 der System-Schnittstelle bleiben wollen, dann können wir die blockorientierten
Funktionen Read und Write verwenden, die direkt mit dem Betriebssystem interagieren.
Hier können wir Blöcke einer spezifizierten Länge entweder lesen oder schreiben.
Mit den flexibleren Bibliotheksfunktionen können wir zusätzlich auch zeichenorientiert
oder zeilenorientiert arbeiten.
Wir können sogar Formatierungen in Form von Formatstrings mit einarbeiten.
Die Funktionen können wir jedoch nicht sofort benutzen.
Stattdessen müssen wir auf Basis des Socket-Deskriptors bzw. des Datei-Deskriptors erst eine Dateiabstraktion
öffnen, nämlich den File-Pointer.
Mit dem File-Pointer können wir nun Funktionen wie fRead, fGets oder fScanf verwenden.
Blockorientiert bedeutet auch hier wieder, dass wir Blöcke einer angegebenen Länge
entweder lesen oder schreiben, während zeichenorientiert bedeutet, dass wir einzelne Zeichen lesen
und einzelne Zeichen schreiben.
Zeilenorientiert bedeutet, dass bis zum Ende eines Strings oder einer Zeile, die durch
ein Backslash-n beendet wird, gelesen wird.
Die Formatierung bezieht sich auf Formatstrings, wie ihr sie schon aus der Printf-Funktion
kennt.
Hier können z.B. Zahlen in Strings konvertiert werden oder eben andersrum.
Nachdem die Dateistromabstraktion der Bibliotheksfunktion deutlich einfacher zu verwenden ist, wollen
wir uns nun anschauen, wie wir diese verwenden können.
Zunächst einmal müssen wir uns ein File-Objekt erstellen.
Und dies geht, indem wir mit dem vorhandenen Dateideskripto die fDOpen-Funktion aufrufen.
Diese erwartet als erstes Argument eben den Deskripto und als zweites Argument einen Modus,
in dem die Datei geöffnet wird.
Der Modus ist ein String, der aus einer Buchstabenkombination besteht.
Wir können in dem String entweder schreiben R für lesenden Zugriff, W für schreibenden
oder A, um am Ende der Datei anzuhängen.
Zusätzlich können wir noch das Pluszeichen mit verwenden, wenn wir sowohl lesend als
auch schreibend auf den Deskripto zugreifen wollen.
Dabei ist zu beachten, dass der Deskripto beim Initialen Öffnen ebenfalls mit den Rechten
geöffnet worden sein muss.
Dies betrifft vor allem den Zugriff auf Dateien, da diese mit dem OpenSystemCall ebenfalls
so geöffnet werden, dass ein Dateideskripto der Rückgabewert ist.
Der Rückgabewert der fDOpen-Funktion ist nun ein Zeiger auf ein File-Objekt.
Diesen können wir für die zuvor genannten Funktionen verwenden, wie z.B.
fprintf.
Sobald wir mit der Kommunikation fertig sind, müssen wir den FilePointer wieder schließen.
Dies geht, indem wir die fClose-Funktion aufrufen und hier den Zeiger als Argument angeben.
Der Rückgabewert zeigt, ob das Schließen erfolgreich war oder eben nicht.
Zugänglich über
Offener Zugang
Dauer
00:07:34 Min
Aufnahmedatum
2020-11-01
Hochgeladen am
2020-11-02 00:07:18
Sprache
de-DE